using System;
using System.Collections.Generic;

namespace M0
{
    public class MyEvent : BaseSingle<MyEvent>, ISingle
    {

        public void Init()
        {
        }

        /// <summary>
        /// 添加事件
        /// </summary>
        /// <param name="key"></param>
        /// <param name="call"></param>
        public void AddEvent(string key, Action call)
        {
            if (事件储存.ContainsKey(key))
            {
                if (事件储存[key] is Action a)
                {
                    a += call;
                    事件储存[key] = a;
                }
                else
                {
                    BDebug.Warn($"事件被替换：{key}");
                    事件储存[key] = call;
                }
            }
            else
            {
                事件储存.Add(key, call);
            }
        }

        public void AddEvent<T>(string key, Action<T> call)
        {
            if (事件储存.ContainsKey(key))
            {
                if (事件储存[key] is Action<T> a)
                {
                    a += call;
                    事件储存[key] = a;
                }
                else
                {
                    BDebug.Warn($"事件被替换：{key}");
                    事件储存[key] = call;
                }
            }
            else
            {
                事件储存.Add(key, call);
            }
        }

        public void AddEvent<T, M>(string key, Action<T, M> call)
        {
            if (事件储存.ContainsKey(key))
            {
                if (事件储存[key] is Action<T, M> a)
                {
                    a += call;
                    事件储存[key] = a;
                }
                else
                {
                    BDebug.Warn($"事件被替换：{key}");
                    事件储存[key] = call;
                }
            }
            else
            {
                事件储存.Add(key, call);
            }
        }

        /// <summary>
        /// 移除事件
        /// </summary>
        /// <param name="key"></param>
        /// <param name="call"></param>
        public void RemoveEvent(string key)
        {
            if(事件储存.ContainsKey(key))
            {
                事件储存.Remove(key);
            }
        }
        public void RemoveEvent(string key, Action call)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action a)
            {
                a -= call;
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }

        public void RemoveEvent<T>(string key, Action<T> call)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action<T> a)
            {
                a -= call;
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }

        public void RemoveEvent<T, M>(string key, Action<T, M> call)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action<T, M> a)
            {
                a -= call;
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }

        /// <summary>
        /// 执行
        /// </summary>
        /// <param name="key"></param>
        /// <param name="一次性"></param>
        public void DoEvent(string key, bool 一次性 = false)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action a)
            {
                a.Invoke();
                if (一次性)
                {
                    事件储存.Remove(key);
                }
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }

        public void DoEvent<T>(string key, T p, bool 一次性 = false)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action<T> a)
            {
                a.Invoke(p);
                if (一次性)
                {
                    事件储存.Remove(key);
                }
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }

        public void DoEvent<T, M>(string key, T p, M m, bool 一次性 = false)
        {
            if (事件储存.ContainsKey(key) && 事件储存[key] is Action<T, M> a)
            {
                a.Invoke(p, m);
                if (一次性)
                {
                    事件储存.Remove(key);
                }
            }
            else
            {
                BDebug.Error($"没有这个事件：{key}");
            }
        }


        private Dictionary<string, object> 事件储存 = new Dictionary<string, object>();
    }
}
